package com.cyzy.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;


public class TokenUtil {
    private static String secret = "curryandkd";

    public static String createToken(String value){
        //30分钟后过期
        long ms = System.currentTimeMillis() + 1000 * 60 * 30;

        Date date = new Date(ms);
        String token = JWT.create()
                .withAudience(value)    //PayLoad
                .withExpiresAt(date)    //过期时间
                .sign(Algorithm.HMAC256(secret));
        return token;
    }

    //解密 + 验证方法
    // 验证并解析 JWT Token，返回其中的 audience 值（通常是用户ID或用户名）
    public static String verifyToken(String token) {
        try {
            // 创建 JWT 验证器，指定签名算法和密钥
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build();

            // 验证并解析 Token（如果签名错误、格式错误、过期，都会抛异常）
            DecodedJWT jwt = verifier.verify(token);

            // 获取 Payload 中的 audience 字段（通常是一个列表，这里取第一个）
            return jwt.getAudience().get(0);
        } catch (TokenExpiredException e) {
            // Token 超过设置的过期时间
            System.out.println("Token 已过期");
        } catch (SignatureVerificationException e) {
            // Token 签名不匹配（被篡改或密钥错误）
            System.out.println("签名验证失败");
        } catch (JWTDecodeException e) {
            // Token 解析失败（格式非法）
            System.out.println("Token 解码失败");
        } catch (JWTVerificationException e) {
            // 其他验证失败（如非法Token等）
            System.out.println("Token 验证失败");
        }

        // 验证失败时返回 null
        return null;
    }

}
